package com.inibb.app.service.admin.impl;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.inibb.app.converter.Db2VOConverter;
import com.inibb.app.dao.JpaGenericDao;
import com.inibb.app.dao.api.IDao;
import com.inibb.app.pagination.dto.PaginationCriteria;
import com.inibb.app.po.SaI18NMsg;
import com.inibb.app.service.admin.II18nMsgService;
import com.inibb.app.vo.I18nMsgSC;




@Transactional
@Service
public class I18nMsgServiceImpl implements II18nMsgService {
	
	private static final long serialVersionUID = 1L;
	
	private IDao<SaI18NMsg, Integer> dao;
	
	@PersistenceContext(unitName = "entityManager")
	private EntityManager entityManager ;
	
	@Autowired
	public void setEntityManagerFactory() {
		dao = new JpaGenericDao<SaI18NMsg, Integer>(entityManager, SaI18NMsg.class);
	}
	
	@Override
	public void delete(Integer id) {
		dao.delete(get(id));
	}

	@Override
	public SaI18NMsg get(Integer id) {
		return dao.get(id);
	}

	@Override
	public SaI18NMsg save(SaI18NMsg p) {
		if(p.getId()==null)
			dao.persist(p);
		else
			dao.merge(p);
		return p;
	}

	@Override
	public List<SaI18NMsg> getI18nMessagesByLocale(final String locale) {
		I18nMsgSC paginationCriteria = new I18nMsgSC();
		paginationCriteria.setLocale(locale);
		paginationCriteria.setStartRow(0);
		paginationCriteria.setPageSize(Integer.MAX_VALUE);
		return searchPages(paginationCriteria);
//		List<SaI18NMsg> ls = dao.getHibernateTemplate().execute(new HibernateCallback<List<SaI18NMsg>>(){
//			@Override
//			public List<SaI18NMsg> doInHibernate(Session session)
//					throws HibernateException, SQLException {
//				Criteria criteria = session.createCriteria(SaI18NMsg.class);
//				criteria.add(Restrictions.eq("locale", locale));
//				
//				return (List<SaI18NMsg>)criteria.list();
//			}
//			
//		});
//		return ls;
	}
	@Override
	public SaI18NMsg find(final String locale, final String type, final String key) {
		I18nMsgSC paginationCriteria = new I18nMsgSC();
		paginationCriteria.setStartRow(0);
		paginationCriteria.setPageSize(1);
		paginationCriteria.setLocale(locale);
		paginationCriteria.setMtype(type);
		paginationCriteria.setMkey(key);
		Object[] obj = (Object[]) dao.queryNativeSqlForObject("admin", "countPageI18nMsg", paginationCriteria);
		return Db2VOConverter.toVO4I18NMsg(obj);
		
//		SaI18NMsg ls = dao.getHibernateTemplate().execute(new HibernateCallback<SaI18NMsg>(){
//			@Override
//			public SaI18NMsg doInHibernate(Session session)
//					throws HibernateException, SQLException {
//				Criteria criteria = session.createCriteria(SaI18NMsg.class);
//				criteria.add(Restrictions.eq("locale", locale));
//				criteria.add(Restrictions.eq("mtype", type));
//				criteria.add(Restrictions.eq("mkey", key));
//				
//				return (SaI18NMsg) criteria.uniqueResult();
//			}
//			
//		});
//		return ls;
	}

	public int countPages(I18nMsgSC paginationCriteria) {
		BigInteger total = (BigInteger) dao.queryNativeSqlForObject("admin", "countPageI18nMsg", paginationCriteria);
		
		return total.intValue();
	}

	public List<SaI18NMsg> searchPages(I18nMsgSC paginationCriteria) {
		List<Object[]> list = (List<Object[]>) dao.queryNativeSqlForList("admin", "searchPageI18nMsg", paginationCriteria);
		List<SaI18NMsg> gcList = new ArrayList<SaI18NMsg>();
		for(Object[] obj:list){
			gcList.add(Db2VOConverter.toVO4I18NMsg(obj));
		}
		return gcList;
	}

	public int countPages(PaginationCriteria paginationCriteria) {
		BigInteger total = (BigInteger) dao.queryNativeSqlForObject("admin", "countPageI18nMsg", paginationCriteria);
		
		return total.intValue();
	}

	public List<SaI18NMsg> searchPages(PaginationCriteria paginationCriteria) {
		List<Object[]> list = (List<Object[]>) dao.queryNativeSqlForList("admin", "searchPageI18nMsg", paginationCriteria);
		List<SaI18NMsg> gcList = new ArrayList<SaI18NMsg>();
		for(Object[] obj:list){
			gcList.add(Db2VOConverter.toVO4I18NMsg(obj));
		}
		return gcList;
	}
}
